/*
 * @author hzq
 * @date 2024-12-02 12:54:52
 * @description 带缓存功能的计算属性hook函数;对tabel中增加的列计算属性赋值复用
 * @see 🚀
 * @status done
 */

import { computed } from 'vue'

/**
 * 带缓存功能的计算属性hook函数
 * @param fn 计算属性的函数
 * @returns
 */
export function useComputed(fn: Function) {
  // 创建一个Map对象，用于缓存计算结果
  const cache = new Map()
  // 比较两个数组是否相等
  function compare(args1: any[], args2: any[]) {
    // 判断args1和args2的长度是否相等
    // 如果相等，则遍历args1的每一个元素，判断其是否与args2中对应位置的元素相等
    // 如果所有元素都相等，则返回true，否则返回false
    return (
      args1.length === args2.length &&
      args1.every((item, index) => Object.is(item, args2[index]))
    )
  }

  // 根据参数获取缓存结果
  function getCache(args: any[]) {
    // 获取缓存中的所有键
    const keys = [...cache.keys()]
    // 在键中查找与参数相等的键
    const key = keys.find((item) => compare(item, args))
    // 如果找到了相等的键，则返回对应的值
    if (key) {
      return cache.get(key)
    }
  }

  // 返回一个函数，用于计算属性
  return function (...args: any[]) {
    // 获取缓存结果
    const cacheResult = getCache(args)
    if (cacheResult) {
      return cacheResult
    }
    // 计算属性
    const result = computed(() => fn(...args))
    // 将计算结果存入缓存
    cache.set(args, result)
    return result.value
  }
}
